﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OBL1_DiseñoDeAplicaciones.ObjetosDeNegocio;
using OBL1_DiseñoDeAplicaciones.Utilidades;


namespace OBL1_DiseñoDeAplicaciones.Interfaz
{
    public partial class Proyecto_Definicion : Form,IObservador,IObservado
    {
        private const int _ImagenSubproyecto = 1;
        private const int _ImagenTarea = 0;
        private const string _Tarea = "TAREA";
        private const string _Subproyecto = "SUBPROYECTO";

        private Empresa empresa;
        private Proyecto proyecto;
        private Proyecto proyectoTemp;
        private List<IObservador> observadores = new List<IObservador>();

        #region OBSERVADO

        public void agregarObservador(IObservador obs)
        {
            // Agrega un objeto Observador a la colección
            observadores.Add(obs);
        }

        public void removerObservador(IObservador obs)
        {
            observadores.Remove(obs);

        }

        public void notificarTodos()
        {
            foreach (IObservador obs in observadores)
            {
                obs.actualizar();
            }

        }
        #endregion 

        public Proyecto_Definicion(Proyecto p, IObservador obs)
        {
            InitializeComponent();
            empresa = Empresa.GetInstance();
            proyecto = p;
            proyectoTemp = proyecto.Clonar();
            if (obs!=null){
                agregarObservador(obs);
            }
            CargarDatos();
        }

        public void CargarDatos() {
            CargarComboCliente();
            cbClientes.SelectedValue = proyectoTemp.Cliente.Ruc;
            txtNombre.Text = proyectoTemp.Nombre;
            lblFechaInicioValor.Text = proyectoTemp.ObtenerFechaInicio().ToShortDateString();
            lblCostoTotalValor.Text = proyectoTemp.ObtenerCostoTotal(empresa.Iva).ToString();
            CargarArbol();
            pnlItemSeleccionado.Visible = false;
        
        }

        private void CargarArbol() {
            //Cargo la raiz
            TreeNode mainNode = new TreeNode();
            mainNode.Name = "nodoPadre_" + proyectoTemp.Codigo;
            mainNode.Text = proyectoTemp.Nombre;
            mainNode.ContextMenuStrip = Menu_MainMenu;
            mainNode.ImageIndex = 1;
            mainNode.SelectedImageIndex=1;
            mainNode.Tag = proyectoTemp;
            arbolProyecto.Nodes.Clear();
            arbolProyecto.Nodes.Add(mainNode);
            arbolProyecto.ImageList = arbolImagenes;

            //Cargo los hijos
            List<Subdivision> lista = proyectoTemp.Subdivisiones.Elementos;
            foreach (Subdivision elem in lista){
                CargarSubarbol(mainNode, elem);
            }
        }

        private void CargarSubarbol(TreeNode nodoPadre, Subdivision sub)
        { 
            TreeNode nodo = new TreeNode();
            nodo.Text = sub.Descripcion;
            nodo.Tag = sub;

            if (sub.GetType() != typeof(Tarea))
            {
                // Si es subproyecto hago la recursion
                nodo.ContextMenuStrip = Menu_Subproyecto;
                nodo.ImageIndex = _ImagenSubproyecto;
                nodo.SelectedImageIndex = _ImagenSubproyecto;
                List<Subdivision> lista = ((Subproyecto)sub).Componentes.Elementos;
                foreach (Subdivision elem in lista)
                {
                    CargarSubarbol(nodo,elem);
                }
            }
            else
            {
                // Es tarea
                nodo.ContextMenuStrip = Menu_Tarea;
                nodo.ImageIndex = _ImagenTarea;
                nodo.SelectedImageIndex = _ImagenTarea;
            }
            nodoPadre.Nodes.Add(nodo); 
        }

        private void CargarComboCliente()
        {
            cbClientes.DataSource = empresa.Clientes;
            cbClientes.DisplayMember = "Nombre";
            cbClientes.ValueMember = "Ruc";

        }

        #region Eventos de los menus

        //MAIN MENU
        private void MenuItem_AddSubMain_Click(object sender, EventArgs e)
        {
            AgregarSubdivision(true,false);
        }

        private void MenuItem_AddTaskMain_Click(object sender, EventArgs e)
        {
            AgregarSubdivision(true,true);
        }

        //SUBPROYECTO MENU
        private void MenuItem_agregarSubproyecto_Click(object sender, EventArgs e)
        {
            AgregarSubdivision(false,false);
        }

        private void MenuItem_agregarTarea_Click(object sender, EventArgs e)
        {
            AgregarSubdivision(false,true);
        }

        private void MenuItem_SubEdit_Click(object sender, EventArgs e)
        {
            Subdivision_Editar s = new Subdivision_Editar(false, (Subdivision)arbolProyecto.SelectedNode.Tag,this,empresa.Iva);
            s.Show();
        }

        //TAREA MENU 
        private void MenuItem_EditTask_Click(object sender, EventArgs e)
        {
            Subdivision_Editar s = new Subdivision_Editar(true,(Subdivision)arbolProyecto.SelectedNode.Tag,this,empresa.Iva);
            s.Show();
        }

        #endregion

        private void AgregarSubdivision(bool esRaiz,bool esTarea) {
            Subdivision_Agregar s = null;
            if (esRaiz)
            {
                s = new Subdivision_Agregar(esTarea, this,(Proyecto)arbolProyecto.SelectedNode.Tag);
            }
            else
            {
                s = new Subdivision_Agregar(esTarea, this, ((Subproyecto)arbolProyecto.SelectedNode.Tag).Parent);
            }
            if (s.ShowDialog() == DialogResult.OK){
                // creo el nodo a añadir
                TreeNode nod = new TreeNode();
                nod.Text = s.Sub.Descripcion ;
                if (s.TagNodo.Equals(_Tarea))
                {
                    nod.ImageIndex = _ImagenTarea;
                    nod.SelectedImageIndex = _ImagenTarea;
                    nod.ContextMenuStrip = Menu_Tarea;
                }
                else {
                    nod.ImageIndex = _ImagenSubproyecto;
                    nod.SelectedImageIndex = _ImagenSubproyecto;
                    nod.ContextMenuStrip = Menu_Subproyecto;
                }

                // asigno tarea a nodo
                nod.Tag = s.Sub;

                // Añado el nodo al arbol
                arbolProyecto.SelectedNode.Nodes.Add(nod);
                arbolProyecto.SelectedNode.ExpandAll();

                // añado la tarea a la lista de subdivisiones
                if (esRaiz)
                {
                    Proyecto p = (Proyecto)arbolProyecto.SelectedNode.Tag;
                    p.Subdivisiones.AgregarSubdivision(s.Sub);
                }
                else
                {
                    Subproyecto sub = (Subproyecto)arbolProyecto.SelectedNode.Tag;
                    sub.Componentes.AgregarSubdivision(s.Sub);
                }
                actualizar();
            }
            
        }

        #region Eventos
        
        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            proyectoTemp.Cliente = (from Cliente c in empresa.Clientes where c.Ruc == cbClientes.SelectedValue.ToString() select c).First();
            proyectoTemp.Nombre = txtNombre.Text;
            empresa.Proyectos[empresa.Proyectos.IndexOf(proyecto)] = proyectoTemp;
            this.notificarTodos();
            this.Dispose();
        }

        private void BtnCancelar_Click(object sender, EventArgs e)
        {
            DialogResult res = MessageBox.Show("Los cambios realizados serán descartados. Desea continuar?", "Atención", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            if (res == DialogResult.OK) { 
                this.Dispose(); 
            }
        }

        //Se ejecuta en cualquier clic sobre el arbol, (x,y) es la posicion en la pantalla donde se cliqueo
        private void arbolProyecto_MouseClick(object sender, MouseEventArgs e)
        {
            arbolProyecto.SelectedNode = arbolProyecto.GetNodeAt(e.X, e.Y);
            MostrarInformacionNodoSeleccionado();
        }
       
        #endregion

        public void actualizar()
        {
            CargarDatos();
        }

        private void MostrarInformacionNodoSeleccionado() {
            if (arbolProyecto.SelectedNode.Tag.GetType() == typeof(Proyecto))
            {
                pnlItemSeleccionado.Visible = false;
            }
            else {
                lblItemSeleccionadoToString.Text = arbolProyecto.SelectedNode.Tag.ToString();
                lblItemSeleccionadoToString.Text = lblItemSeleccionadoToString.Text + "Costo final para el cliente: " + ((Subdivision)arbolProyecto.SelectedNode.Tag).ObtenerCostoTotal(empresa.Iva).ToString();

                pnlItemSeleccionado.Visible = true;
            }
        }
    }
}
